package com.itheima.demo;
public class TestAnimal{
    public static void main(String[] args) {
        Cat cat = new Cat("Catname","blue eyes");//实际上new的是子类，而不是引用对象。new哪个对象，调用的就是哪个类的方法
        Dog dog = new Dog("Dogname","grey fur");
        Lady lily = new Lady("Lily",cat);
        lily.myPetEnjoy();
        Lady lucy = new Lady("Lucy",dog);
        lucy.myPetEnjoy();
    }
}
class Lady {
    private String name;
    private Animal pet;//定义成父类的引用最灵活，可以传Dog，Cat，Bird...


    public Lady(String name, Animal pet) {//传递一个Animal的引用，养一个宠物
        this.name = name;
        this.pet = pet ;
    }

    //若是静态引用，需要在这里判断instanceof 类型 例如：如果是Dog，则调用Dog的enjoy方法，如果是Cat，则调用Cat的enjoy方法。
    //而动态绑定则不需要，当你需要添加某个东西时候，你直接加上这个类，继承父类重写它的方法，在main方法里添加新逻辑就可以，不需要再改方法，达到了最大的扩展性。
    public void myPetEnjoy() {
        System.out.println(name + "有一个宠物" +pet.getClass()+ "," );
        pet.enjoy();//Animal pet = cat;
    }
}

class Animal {
    String name;
    public Animal(String name) {
        this.name = name;
    }
    public void enjoy(){
        System.out.println("动物叫声..........");
    }
}

class Cat extends Animal {
    private String eyesColor;

    Cat(String name, String eyesColor) {
        super(name);
        this.eyesColor = eyesColor;
    }

    public void enjoy() {
        System.out.println("猫咪在叫....喵喵,"+eyesColor);
    }
}

class Dog extends Animal {
    private String furColor;

    public Dog(String name, String furColor) {
        super(name);
        this.furColor = furColor;
    }

    public void enjoy() {
        System.out.println("狗狗在叫.....汪汪."+furColor);
    }

}

